"""
云盘提供者工厂

用于创建不同类型的云盘提供者实例。
"""

from typing import Dict, Any, Optional, Type
from .base import BaseCloudProvider


class CloudProviderFactory:
    """云盘提供者工厂类"""
    
    # 注册的提供者类
    _providers: Dict[str, Type[BaseCloudProvider]] = {}
    
    @classmethod
    def register_provider(cls, provider_type: str, provider_class: Type[BaseCloudProvider]):
        """
        注册提供者类
        
        Args:
            provider_type: 提供者类型
            provider_class: 提供者类
        """
        cls._providers[provider_type] = provider_class
    
    @classmethod
    def create_provider(cls, provider_type: str, config: Dict[str, Any]) -> Optional[BaseCloudProvider]:
        """
        创建提供者实例
        
        Args:
            provider_type: 提供者类型
            config: 配置参数
            
        Returns:
            Optional[BaseCloudProvider]: 提供者实例，失败返回None
        """
        # 动态导入提供者类
        if provider_type not in cls._providers:
            cls._load_provider(provider_type)
        
        provider_class = cls._providers.get(provider_type)
        if provider_class:
            try:
                return provider_class(config)
            except Exception as e:
                print(f"创建提供者 {provider_type} 失败: {e}")
                return None
        else:
            print(f"不支持的提供者类型: {provider_type}")
            return None
    
    @classmethod
    def _load_provider(cls, provider_type: str):
        """
        动态加载提供者类
        
        Args:
            provider_type: 提供者类型
        """
        try:
            if provider_type == "tianyi_pc":
                from .tianyi_pc.client import TianyiPCProvider
                cls.register_provider(provider_type, TianyiPCProvider)
            elif provider_type == "tianyi_tv":
                from .tianyi_tv.client import TianyiTVProvider
                cls.register_provider(provider_type, TianyiTVProvider)
            elif provider_type == "tianyi":
                from .tianyi.adapter import TianyiAdapter
                cls.register_provider(provider_type, TianyiAdapter)
            # 可以继续添加其他提供者
            # elif provider_type == "baidu":
            #     from .baidu.client import BaiduProvider
            #     cls.register_provider(provider_type, BaiduProvider)
        except ImportError as e:
            print(f"导入提供者 {provider_type} 失败: {e}")
    
    @classmethod
    def get_supported_types(cls) -> list:
        """
        获取支持的提供者类型
        
        Returns:
            list: 支持的提供者类型列表
        """
        # 返回已知的提供者类型
        return ["tianyi_pc", "tianyi_tv", "tianyi"]
    
    @classmethod
    def is_supported(cls, provider_type: str) -> bool:
        """
        检查是否支持指定的提供者类型
        
        Args:
            provider_type: 提供者类型
            
        Returns:
            bool: 是否支持
        """
        return provider_type in cls.get_supported_types()